package BaseDatos;

import Modelo.Grupo;
import Modelo.Lecciones;
import Modelo.Materia;
import Modelo.Nivel;
import Modelo.Profesor;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;

public class GestorProfesor {

    private String URL_Servidor = "localhost";
    private static final String BASE_DATOS = "ADEHO";
    private static final String LOGIN = "root";
    private static final String PASSWORD = "root";
    private static final String CMD_LISTAR = "SELECT cedula,nombre,direccion,telefono,restriccion,tipo,gradoAcademico "
            + "FROM profesor";
    // obtener cosas
    private static final String CMD_OBTENER_PROFE_NOMBRE = "SELECT * FROM profesor WHERE nombre=?";
    private static final String CMD_OBTENER_PROFES_NIVEL = "SELECT cedula FROM profesornivel WHERE idNivel=?";
    private static final String CMD_OBTENER_LECCIONES = "SELECT* FROM lecciones";
    private static final String CMD_OBTENER_MATERIAS = "SELECT nombreMateria FROM profesormateria where cedula=?";
    private static final String CMD_OBTENER_GRUPOS = "SELECT grupo.seccion,profesorGuia,nivel FROM grupo,grupoprofesor WHERE grupoprofesor.cedula=?"; // EDITABLE
    private static final String CMD_OBTENER_NIVELES = "SELECT * from profesornivel where cedula=?";
    private static final String CMD_OBTENER_PROFESOR = "SELECT * FROM profesor WHERE cedula= ?";
    private static final String CMD_OBTENER_LECCIONES_PROFESOR = "Select * from lecciones where cedula=?";
    // agregar cosas
    private static final String CMD_AGREGAR_MATERIAS = "INSERT INTO profesormateria Values(?,?)"; // cuando se crea el profesor
    private static final String CMD_AGREGAR_LECCIONES = "INSERT INTO lecciones VALUES(?,?,?,?)";
    private static final String CMD_AGREGAR_GRUPOS = "INSERT INTO grupoprofesor VALUES(?,?,?)";
    private static final String CMD_AGREGAR_NIVEL = "INSERT INTO profesornivel VALUES(?,?,?)";
    private static final String CMD_INCLUIR = "INSERT into profesor VALUES (?,?,?,?,?,?,?) ";
    // Borrar cosas
    private static final String CMD_BORRAR = "DELETE FROM profesor WHERE cedula=?";
    private static final String CMD_BORRAR_MATERIAS = "DELETE FROM profesormateria WHERE cedula=?";
    private static final String CMD_BORRAR_GRUPO = "DELETE FROM grupoprofesor WHERE cedula=?";
    private static final String CMD_BORRAR_LECCIONES = "DELETE FROM lecciones WHERE cedula=?";
    private static final String CMD_BORRAR_NIVELES = "DELETE FROM profesornivel WHERE cedula=?";
    // modificar cosas
    private static final String CMD_MODIFICAR
            = "UPDATE profesor SET cedula=?, nombre=?, direccion=?, telefono=?, restriccion=?,"
            + "tipo=?, gradoAcademico=? WHERE cedula= ?";
    private static final String CMD_MODIFICAR_LECCIONES = "UPDATE lecciones set cantLecciones=? , leccionesRest=? where cedula=?";
    private static final String CMD_ACTUALIZAR_LECCIONES = "UPDATE lecciones set cantLecciones=? , leccionesRest=? where cedula=?";
    private static final String CMD_RESTAR_LECCIONES = "UPDATE lecciones set leccionesRest=? where cedula=?";
    private static final String CMD_MODIFICAR_NIVELES = "UPDATE profesornivel set idNivel=? where cedula=?";

    Calendar c = new GregorianCalendar();
    Calendar Calendario = Calendar.getInstance();

    public ArrayList<Profesor> ListarProfesores() {
        ArrayList<Profesor> profesores = new ArrayList();
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_LISTAR);

            while (rs.next()) {
                String cedula = rs.getString(1);
                String nombre = rs.getString(2);
                String telefono = rs.getString(4);
                String direccion = rs.getString(3);
                String gradoAcademico = rs.getString(7);
                String restriccion = rs.getString(5);
                String tipo = rs.getString(6);
                Profesor p = new Profesor(cedula, nombre, telefono, direccion, gradoAcademico, restriccion, tipo);
                profesores.add(p);

            }
            for (Profesor p : profesores) {
                this.listarLeccionesDeProfesores();
                this.obtenerMateriaDeProfesor(p);
                this.obtenerNivelesDeProfesor(p);
            }

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return profesores;
    }

    public Profesor obtenerProfesor(String cedula) {
        Profesor p = null;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_PROFESOR);
            stm.clearParameters();
            stm.setString(1, cedula);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                p = new Profesor(rs.getString(1), rs.getString(2), rs.getString(3),
                        rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7));
            }

            //stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return p;
    }

    public Profesor obtenerProfesorNombre(String nombre) {
        Profesor p = null;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_PROFE_NOMBRE);
            stm.clearParameters();
            stm.setString(1, nombre);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                p = new Profesor(rs.getString(1), rs.getString(2), rs.getString(3),
                        rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7));
            }

            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return p;
    }

    public boolean agregarMateriasAlProfesor(Profesor p, ArrayList<String> materias) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_AGREGAR_MATERIAS);
            stm.clearParameters();

            for (String m : materias) {
                stm.setString(1, p.getCedula());
                stm.setString(2, m);
                actualizado += stm.executeUpdate();
            }
            exito = actualizado == materias.size();
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean agregarGruposAlProfesor(Profesor p, ArrayList<Grupo> grupos) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_AGREGAR_GRUPOS);
            stm.clearParameters();

            for (Grupo g : grupos) {
                stm.setString(1, p.getCedula());
                stm.setString(2, g.getSeccion());
                stm.setString(3, String.valueOf(GregorianCalendar.YEAR)); // HAY QUE PROBAR
            }
            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean agregarNivelesAlProfesor(Profesor p, ArrayList<Nivel> niveles) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_AGREGAR_NIVEL);
            stm.clearParameters();

            for (Nivel n : niveles) {
                stm.setString(1, p.getCedula());
                stm.setString(2, n.getIdNivel());
                stm.setString(3, String.valueOf(GregorianCalendar.YEAR)); // HAY QUE PROBAR
                actualizado = stm.executeUpdate();
            }

            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean ModificarNivelesAlProfesor(Profesor p, ArrayList<Nivel> niveles) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_MODIFICAR_NIVELES);
            stm.clearParameters();

            for (Nivel n : niveles) {
                stm.setString(2, p.getCedula());
                stm.setString(1, n.getIdNivel());
                actualizado = stm.executeUpdate();
            }

            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean agregarLeccionesAlProfesor(Profesor p, ArrayList<Lecciones> lecciones) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_AGREGAR_LECCIONES);
            stm.clearParameters();

            for (Lecciones l : lecciones) {
                stm.setString(1, p.getCedula());
                stm.setInt(2, l.getCantLecciones());
                stm.setString(3, String.valueOf(GregorianCalendar.YEAR)); // HAY QUE PROBAR
            }
            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean ModificarLeccionesAlProfesor(String cedula, int cantidad) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_MODIFICAR_LECCIONES);
            stm.clearParameters();

            stm.setString(3, cedula);
            stm.setInt(1, cantidad);
            stm.setInt(2, cantidad);

            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean actualizarLeccionesProfesor(Lecciones leccion) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_ACTUALIZAR_LECCIONES);
            stm.clearParameters();

            stm.setString(3, leccion.getCedula());
            stm.setInt(1, leccion.getCantLecciones());
            stm.setInt(2, leccion.getLeccionesRestantes());

            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean SetLeccionesRestantes(String cedula, int cantidad) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_RESTAR_LECCIONES);
            stm.clearParameters();

            stm.setString(2, cedula);
            stm.setInt(1, cantidad);

            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public void obtenerGruposDeProfesor(Profesor p) {
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_GRUPOS);
            stm.clearParameters();
            stm.setString(1, p.getCedula());
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                Grupo g = new Grupo(rs.getString(1), rs.getString(2), rs.getString(3));
                p.agregarGrupo(g);

            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }

    }

    public ArrayList<Nivel> obtenerNivelesDeProfesor(Profesor p) {
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_NIVELES);
            stm.clearParameters();
            stm.setString(1, p.getCedula());
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Nivel n = new Nivel(rs.getString(2), rs.getString(3));
                p.agregarNivel(n);

            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return p.getNiveles();

    }

    public ArrayList<Lecciones> obtenerLecciones() {
        GestorBD bd = null;
        ArrayList<Lecciones> lecciones = new ArrayList();
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_OBTENER_LECCIONES);

            while (rs.next()) {
                Lecciones l = new Lecciones(rs.getString(2), rs.getString(1), rs.getInt(3), rs.getInt(4));
                lecciones.add(l);

            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return lecciones;

    }

    public ArrayList<Lecciones> obtenerLeccionesDeProfesor(Profesor p) {
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_LECCIONES_PROFESOR);
            stm.clearParameters();
            stm.setString(1, p.getCedula());
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Lecciones l = new Lecciones(rs.getString(2), rs.getString(1), rs.getInt(3));
                p.agregarLecciones(l);

            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return p.getLecciones();

    }

    public Lecciones obtenerLeccionesProfesor(Profesor p) {
        GestorBD bd = null;
        Lecciones l = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_LECCIONES_PROFESOR);
            stm.clearParameters();
            stm.setString(1, p.getCedula());
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                l = new Lecciones(rs.getString(2), rs.getString(1), rs.getInt(3), rs.getInt(4));
            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return l;

    }

    public void obtenerMateriaDeProfesor(Profesor p) {
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_MATERIAS);
            stm.clearParameters();
            stm.setString(1, p.getCedula());
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                String m = rs.getString(1);
                p.agregarMateria(m);
            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
    }

    public ArrayList<Materia> listarMateriaProfesor(Profesor p) {
        ArrayList<Materia> listaMaterias = new <Materia>ArrayList();
        GestorBD bd = null;
        String cedula;
        String materia;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            //PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_MATERIAS);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("SELECT * FROM profesormateria where cedula='" + p.getCedula() + "';");
            while (rs.next()) {
                cedula = rs.getString(2);
                materia = rs.getString(1);
                Materia m = new Materia(cedula, materia, 0);

                listaMaterias.add(m);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return listaMaterias;
    }

    public ArrayList<Lecciones> listarLeccionesDeProfesores() {
        ArrayList<Lecciones> listaLecciones = new <Lecciones>ArrayList();
        GestorBD bd = null;
        String cedula = "";
        String anio = "";
        String cantLecciones = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_OBTENER_LECCIONES);
            while (rs.next()) {
                cedula = rs.getString(1);
                anio = rs.getString(2);
                cantLecciones = rs.getString(3);
                Lecciones l = new Lecciones(anio, cedula, Integer.parseInt(cantLecciones));

                listaLecciones.add(l);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return listaLecciones;
    }

    public ArrayList<Profesor> obtenerListaDeProfesXNivel(String nivel) {
        ArrayList<Profesor> profesores = new ArrayList();
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("Select cedula from profesornivel where idNivel='" + nivel + "';");

            while (rs.next()) {
                String cedula = rs.getString(1);
                Profesor p = new Profesor(cedula);
                profesores.add(p);

            }
            for (Profesor p : profesores) {
                this.listarLeccionesDeProfesores();
                this.obtenerMateriaDeProfesor(p);
                this.obtenerNivelesDeProfesor(p);
            }

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return profesores;
    }

    public boolean registroProfesor(Profesor nProfesor, ArrayList<String> nMaterias) {
        boolean exito = false;
        int registrosActualizados = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_INCLUIR);
            stm.clearParameters();
            stm.setString(1, nProfesor.getCedula());
            stm.setString(2, nProfesor.getNombre());
            stm.setString(3, nProfesor.getTelefono());
            stm.setString(4, nProfesor.getDireccion());
            stm.setString(5, nProfesor.getGradoAcademico());
            stm.setString(6, nProfesor.getRestriccion());
            stm.setString(7, nProfesor.getTipo());

            registrosActualizados = stm.executeUpdate();
            exito = registrosActualizados == 1;
            this.agregarMateriasAlProfesor(nProfesor, nMaterias);
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean eliminarProfesor(String cedula) {
        boolean exito = false;
        //this.borrarMateriaProfesor(cedula);
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("DELETE FROM profesor WHERE cedula='" + cedula + "';");
            stm.clearParameters();
            stm.executeUpdate();
           
            //stm.close();
            exito = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean borrarMateriaProfesor(String cedula) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("DELETE FROM profesormateria WHERE cedula='" + cedula + "';");
            stm.clearParameters();
            stm.executeUpdate();
            //stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public void eliminarMateriaProfesor(Profesor nProfesor) {
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("DELETE FROM profesormateria WHERE cedula='" + nProfesor.getCedula() + "';");
            stm.clearParameters();
            stm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
    }

    public boolean borrarGruposProfesor(String cedula) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR_GRUPO);
            stm.clearParameters();
            stm.setString(1, cedula);
            stm.executeUpdate();
            stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean borrarLeccionesProfesor(String cedula) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR_LECCIONES);
            stm.clearParameters();
            stm.setString(1, cedula);
            stm.executeUpdate();
            stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean borrarNivelesProfesor(String cedula) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR_NIVELES);
            stm.clearParameters();
            stm.setString(1, cedula);
            stm.executeUpdate();
            stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean modificarProfesor(String cedula, Profesor nProfesor) {
        boolean exito = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_MODIFICAR);
            stm.setString(1, nProfesor.getCedula());
            stm.setString(2, nProfesor.getNombre());
            stm.setString(3, nProfesor.getDireccion());
            stm.setString(4, nProfesor.getTelefono());
            stm.setString(5, nProfesor.getRestriccion());
            stm.setString(6, nProfesor.getTipo());
            stm.setString(7, nProfesor.getGradoAcademico());
            stm.setString(8, cedula);
            stm.executeUpdate();
            stm.close();
//            PreparedStatement stm = cnx.prepareStatement("UPDATE profesor SET cedula='" + nProfesor.getCedula()
//                    + "', nombre='" + nProfesor.getNombre()
//                    + "', direccion='" + nProfesor.getDireccion()
//                    + "', telefono='" + nProfesor.getTelefono()
//                    + "', restriccion='" + nProfesor.getRestriccion()
//                    + "', tipo='" + nProfesor.getTipo()
//                    + "', gradoAcademico='" + nProfesor.getGradoAcademico()
//                    + "' WHERE cedula='" + cedula + "' ;");
//            stm.clearParameters();
//            stm.executeUpdate();
            stm.close();
            exito = true;

        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.err.println(e.getCause());
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }
    /*AQUI COMIENZA EL MODIFICAR CEDULA DE PROFESOR*/

    public boolean modificarCedulaMateriaProfesor(String cedOriginal, String cedNueva) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("UPDATE profesormateria SET cedula='" + cedNueva + "' WHERE cedula='" + cedOriginal + "';");
            stm.clearParameters();
            stm.executeUpdate();
            //stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean modificarCedulaGruposProfesor(String cedOriginal, String cedNueva) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("UPDATE grupoprofesor SET cedula='" + cedNueva + "' WHERE cedula='" + cedOriginal + "';");
            stm.clearParameters();
            stm.executeUpdate();
            //stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean modificarCedulaLeccionesProfesor(String cedOriginal, String cedNueva) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("UPDATE lecciones SET cedula='" + cedNueva + "' WHERE cedula='" + cedOriginal + "';");
            stm.clearParameters();
            stm.executeUpdate();
            //stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean modificarCedulaNivelesProfesor(String cedOriginal, String cedNueva) {
        boolean borrado = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("UPDATE profesornivel SET cedula='" + cedNueva + "' WHERE cedula='" + cedOriginal + "';");
            stm.clearParameters();
            stm.executeUpdate();
            stm.close();
            borrado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean modificarMateriasProfesor(Profesor nProfesor, ArrayList<String> materias) {
        boolean bandera = false;
        if (this.listarMateriaProfesor(nProfesor) != null) {
            this.eliminarMateriaProfesor(nProfesor);
            this.agregarMateriasAlProfesor(nProfesor, materias);
            bandera = true;
        } else {
            this.agregarMateriasAlProfesor(nProfesor, materias);
            bandera = true;
        }
        return bandera;
    }

    public boolean agregarCantLeccionesProfesor(String cedula, int cantLecciones) {
        GestorBD bd = null;
        int actualizado = 0;
        boolean exito = false;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_AGREGAR_LECCIONES);
            stm.clearParameters();

            stm.setString(1, cedula);
            stm.setString(2, "0");
            stm.setInt(3, cantLecciones); // HAY QUE PROBAR
            stm.setInt(4, cantLecciones);
            actualizado = stm.executeUpdate();
            exito = actualizado == 1;
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }
}
